From: Hans Petter Jansson Date: Wed, 1 Jun 2016 21:29:26 +0000 (+0200) Subject: theme-node: Fix leak on stylesheet change. X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~840 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=72bfa9125945919e9d69505d3e739480855f331e;p=gnome-shell.git theme-node: Fix leak on stylesheet change. on_custom_stylesheet_changed() would set properties_computed to FALSE without freeing the old properties, then the properties pointer would be overwritten in ensure_properties(). https://bugzilla.gnome.org/show_bug.cgi?id=710230 --- diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c index 75df63774..5582c7589 100644 --- a/src/st/st-theme-node.c +++ b/src/st/st-theme-node.c @@ -66,11 +66,30 @@ st_theme_node_class_init (StThemeNodeClass *klass) object_class->finalize = st_theme_node_finalize; } +static void +maybe_free_properties (StThemeNode *node) +{ + if (node->properties) + { + g_free (node->properties); + node->properties = NULL; + node->n_properties = 0; + } + + if (node->inline_properties) + { + /* This destroys the list, not just the head of the list */ + cr_declaration_destroy (node->inline_properties); + node->inline_properties = NULL; + } +} + static void on_custom_stylesheets_changed (StTheme *theme, gpointer data) { StThemeNode *node = data; + maybe_free_properties (node); node->properties_computed = FALSE; } @@ -119,18 +138,7 @@ st_theme_node_finalize (GObject *object) g_strfreev (node->pseudo_classes); g_free (node->inline_style); - if (node->properties) - { - g_free (node->properties); - node->properties = NULL; - node->n_properties = 0; - } - - if (node->inline_properties) - { - /* This destroys the list, not just the head of the list */ - cr_declaration_destroy (node->inline_properties); - } + maybe_free_properties (node); if (node->font_desc) {